Soru & Cevap

PAYLAŞIM - ARDUINO EEPROM Okuma ve Yazma Teknikleri

05.08.2018 - 05:08

Her tip ARDUINO işlemcisinin içinde değişik ebatlarda EEPROM tipi bellek vardır. Bu belleğin özelliği ARDUINO kapatıldığı zaman bellek içeriklerinin silinmemesidir. Yazdığınız kodlarda bir çalışma devresinden ötekine veri kaydetmek ve yeni devrede bu değerleri kullanmak gerekiyorsa EEPROM işinize yarayabilir.

EEPROM fonksiyonarını kullanabilmek için önce EEPROM.h kütüphanesini programınıza eklemeniz gerekir. Bunu yapar yapmaz bir takım EEPROM işlevlerine ulaşma imkanını elde edersiniz. Bunlardan en basiti bize EEPROM belleğini boyutunu bildiren EEPROM.length() işlevidir:

int eepromBellek = EEPROM.length();

kodu eepromBellek değişkenine kullandığımız ARDUINO modelinin EEPROM boyutunu atar. 

Burada dikkat etmemiz gereken bir nokta aldığımız değerin nasıl kullanılacağıdır. EEPROM adresleri sıfır (0) dan başladığı için geri gelen veri değeri adres olarak kullanıldığında sıfır ile eepromBellek - 1 arası olmalıdır. Örneğin: ARDUINO UNO da EEPROM boyutu 1024 dür. Buna göre addres olarak kullandığımızda bu deger 0 - 1023 arasında olmalıdır. Değişik modellerin boyutları değişiktir !

Bu değeri elde ettikten sonra hemen belleği temizlemek için basit bir döngü ile kullanabiliriz:

#include <EEPROM.h>

void setup()
{

int eepromBellek = EEPROM.length();

for (int i = 0 ; i < eepromBellek ; i++) {EEPROM.write(i, '\0');}

}

Bu kodda sıfırdan başlayarak bütün bellek adreslerine NUL ( '\0' ) değerini yazıyoruz. Bunu yaparken EEPROM.write() işlevini kullanıyoruz. Burada belleğe yazdığımız değer tamamen bize kalmış bir seçenektir. NUL (\0), SIFIR (0), BOŞLUK ( ), vs gibi herhangi uygun değer kullanılabilir.

EEPROM a yazıp okuma işlemleri üç tip işlevle sağlanır:

  • EEPROM.read() ve EEPROM.write() : karakter veya bayt olarak okuyup yazma
  • EEPROM.get() ve EEPROM.put() : dizgi veya özel / değişik veri yapılarına göre okuyup yazma
  • EEPROM.update() : Eğer veri bellektekinden değişikse yaz

EEPROM.read() ve EEPROM.write() işlevleri verileri belleğe tek bayt olarak okuyup yazarlar. Yani okunacak veya yazılacak değerlerin 0 - 255 arası bir değer olması gerekir. Kodlamada kullanabileceğimiz veri tipleri char ve byte dır.

EEPROM.get() ve EEPROM.put() işlevleri ise belleğe bir bayttan daha fazla veya uzunlukta veri kaydetmek istediğimiz zaman kullanılır. Örneğin float tipi veriler dört (4) bayt olduğundan bu işlevle kaydedilmesi gerekir. Eğer uzunca bir dizgi veya dizi kaydetmek isterseniz (örneğin: "dosyaadı.txt") bu işlevleri kullanmanız gerekir. Burada dikkat edilecek nokta, dizi veya dizgi yazıp okurken bir seçeneğin döngü ile aynı işlemi yapmaktır. Yani get() veya put() kullanacağımıza bir döngü ile dizi veya dizgi harflerini teker teker read() veya write() kullanarak da yazıp okuyabiliriz. Tabi ki get() ve put() çok daha kolay bir uygulamadır.

Fakat bu iki teknik arasında önemli bir fark vardır: dizi ve dizgi uygulamalarında char[ ] tipi ARRAY veriler bilgisayar belleğinde genelde otomatikman bir NUL karakter ile sonuçlandırıldığından get() ve put() işlevleri yazma ve okuma işlemlerini bu noktaya kadar yaparlar. Yani bir NUL bulunca okuma ve yazma durur. Eğer bu sizin işinize göre değilse, o zaman write() veya read() kullanmanız daha uygun olabilir. Mühim olan işlevlerin nasıl çalıştığı ve sizin ne yapmak istediğiniz !

EEPROM ın kullanılma limiti bellek başına 100.000 yazma devresi olduğundan bu tip belleğe devamlı veya sonsuz bir döngüde işlem yapmak doğru değildir. Yani ARDUINOnun LOOP() kısmına bu tip kodları yazarken dikkatli olun. Bu problemi yok edebilmek için EEPROM.update() işlevi vardır.

EEPROM.update() işlevi yazılacak veriyi yazmak istediğimiz adresteki değer ile karşılaştırır ve yalnız aynı değilse yazma işlemini tamamlar. Böylece lüzumsuz yazma işlemleri engellenmiş olur. Dikkat edilecek nokta bu işlemin yanlız bayt veya karakter modunda çalıştığıdır. Yani bir dizi, dizgi, veya bir bayt tan uzun veri tipleri yazdığımızda bu tekniği bir döngü içinde uygulamamız gerekir.

Yukarıda anlatılan teknikleri uygulayan bir ARDUINO programına şu linkten ulaşabilrsiniz:

https://drive.google.com/open?id=1sLhuDjaDT43f6bToC7eFoSqulz8Z5qRa

Program detayları içinde yazılıdır. 

Bununla oynayarak EEPROM detaylarının ustası olmanızı dilerim.

İyi çalışmalar.

1,317 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-87289-1569234090.png
yakupgovler
28.09.2019 - 12:47

EEPROM.update() fonksiyonunu anlatmanıza sevindim. Çoğu kaynakta bundan bahsedilmiyor.

Profile picture for user bekir_kurt
bekir_kurt
22.09.2019 - 02:37

Bilgilendirme için teşekkürler. özelikle yazma sayısını öğrendiğim iyi oldu.